package com.tledu.zyf.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.tledu.zyf.util.MyBatisUtil;

/**
 * 目的 : 对所有的 Dao 层常用的方法(增删改查)封装到 BaseDao 中,然后其他 dao 继承 basedao
 * 
 * 就可以直接拥有基本的增删改查功能
 * 
 * @author yingfing
 * @date 2020年9月28日 @time 下午5:17:34
 * @param <T>
 */
public class BaseDao<T> {
	/**
	 * 默认根据实体类类全名去找namespace 并且 添加的id 必须是 add
	 * 
	 * @param t
	 */
	public void add(T t) {
		add(t.getClass().getName() + ".add", t);
	}

	/**
	 * 自定义namespace和id 进行调用
	 * 
	 * @param name
	 * @param t
	 */
	public void add(String name, T t) {
		SqlSession session = null;
		try {
			session = MyBatisUtil.getSession();
			/**
			 * 我们如何确定是User.add还是Address.add呢?
			 * 
			 * 1 可以让调用处传递 被调用的SQL
			 * 
			 * 2 可以指定一定的命名规则,比如 我们规定 namespace的命名 必须是类全名
			 * 
			 * 添加的id 必须是add
			 */
			// t.getClass().getName() : 获取类全名

			// 对象.getClass().getName()
			// 类名.class.getName()
			// Class 变量 = 类名.class;
			// int i = 1;
			session.insert(name, t);
			session.commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			MyBatisUtil.closeSession(session);
		}
	}

	public void delete(Class<T> clazz, int id) {
		delete(clazz.getName() + ".delete", id);
	}

	public void delete(String name, int id) {

		SqlSession session = null;
		try {
			session = MyBatisUtil.getSession();
			session.delete(name, id);
			session.commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			MyBatisUtil.closeSession(session);
		}
	}

	public void update(T t) {
		update(t.getClass().getName() + ".update", t);
	}

	public void update(String name, T t) {

		SqlSession session = null;
		try {
			session = MyBatisUtil.getSession();
			session.update(name, t);
			session.commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			MyBatisUtil.closeSession(session);
		}

	}

	public T load(Class<T> clazz, int id) {
		return load(clazz.getName() + ".load", id);
	}

	public T load(String name, int id) {

		SqlSession session = null;
		T t = null;
		try {
			session = MyBatisUtil.getSession();
			t = session.selectOne(name, id);
			session.commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			MyBatisUtil.closeSession(session);
		}
		return t;
	}

	public List<T> list(Class<T> clazz) {
		return list(clazz.getName() + ".list");
	}

	public List<T> list(String name) {
		SqlSession session = null;
		List<T> ts = null;
		try {
			session = MyBatisUtil.getSession();
			ts = session.selectList(name);
			session.commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			MyBatisUtil.closeSession(session);
		}
		return ts;
	}

}
